#!/usr/bin/env python

import numpy as np

operations = (
    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "1"),
       
    ((( 0, 0, 1),
      ( 1, 0, 0),
      ( 0, 1, 0)), "3+ [111]"),
       
    ((( 0, 1, 0),
      ( 0, 0, 1),
      ( 1, 0, 0)), "3- [111]"),

    (((-1, 0, 0),
      ( 0,-1, 0),
      ( 0, 0,-1)), "-1"),

    ((( 0, 0,-1),
      (-1, 0, 0),
      ( 0,-1, 0)), "-3+ [111]"),

    ((( 0,-1, 0),
      ( 0, 0,-1),
      (-1, 0, 0)), "-3- [111]"),

    (((-1, 0, 0),
      ( 0,-1, 0),
      ( 0, 0, 1)), "2 [001]"),

    ((( 0, 0,-1),
      (-1, 0, 0),
      ( 0, 1, 0)), "3+ [1-1-1]"),

    ((( 0,-1, 0),
      ( 0, 0, 1),
      (-1, 0, 0)), "3- [1-1-1]"),

    ((( 0, 1, 0),
      ( 1, 0, 0),
      ( 0, 0,-1)), "2 [110]"),

    ((( 0,-1, 0),
      (-1, 0, 0),
      ( 0, 0,-1)), "2 [1-10]"),

    ((( 0,-1, 0),
      ( 1, 0, 0),
      ( 0, 0, 1)), "4+ [001]"),

    ((( 0, 1, 0),
      (-1, 0, 0),
      ( 0, 0, 1)), "4- [001]"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0,-1)), "m [001]"),

    ((( 0, 0, 1),
      ( 1, 0, 0),
      ( 0,-1, 0)), "-3+ [1-1-1]"),

    ((( 0, 1, 0),
      ( 0, 0,-1),
      ( 1, 0, 0)), "-3- [1-1-1]"),

    ((( 0,-1, 0),
      (-1, 0, 0),
      ( 0, 0, 1)), "m [110]"),

    ((( 0, 1, 0),
      ( 1, 0, 0),
      ( 0, 0, 1)), "m [1-10]"),

    ((( 0, 1, 0),
      (-1, 0, 0),
      ( 0, 0,-1)), "-4+ [001]"),

    ((( 0,-1, 0),
      ( 1, 0, 0),
      ( 0, 0,-1)), "-4- [001]"),
              
    (((-1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0,-1)), "2 [010]"),

    ((( 0, 0, 1),
      (-1, 0, 0),
      ( 0,-1, 0)), "3+ [-11-1]"),

    ((( 0,-1, 0),
      ( 0, 0,-1),
      ( 1, 0, 0)), "3- [-11-1]"),

    ((( 0, 0, 1),
      ( 0,-1, 0),
      ( 1, 0, 0)), "2 [101]"),

    ((( 0, 0,-1),
      ( 0,-1, 0),
      ( 1, 0, 0)), "2 [-101]"),

    ((( 0, 0, 1),
      ( 0, 1, 0),
      (-1, 0, 0)), "4+ [010]"),

    ((( 0, 0,-1),
      ( 0, 1, 0),
      ( 1, 0, 0)), "4- [010]"),

    ((( 1, 0, 0),
      ( 0,-1, 0),
      ( 0, 0, 1)), "m [010]"),

    ((( 0, 0,-1),
      ( 1, 0, 0),
      ( 0, 1, 0)), "-3+ [-11-1]"),

    ((( 0, 1, 0),
      ( 0, 0, 1),
      (-1, 0, 0)), "-3- [-11-1]"),

    ((( 0, 0,-1),
      ( 0, 1, 0),
      (-1, 0, 0)), "m [101]"),

    ((( 0, 0, 1),
      ( 0, 1, 0),
      ( 1, 0, 0)), "m [-101]"),

    ((( 0, 0,-1),
      ( 0,-1, 0),
      ( 1, 0, 0)), "-4+ [010]"),

    ((( 0, 0, 1),
      ( 0,-1, 0),
      (-1, 0, 0)), "-4- [010]"),

    ((( 1, 0, 0),
      ( 0,-1, 0),
      ( 0, 0,-1)), "2 [100]"),

    ((( 0, 0,-1),
      ( 1, 0, 0),
      ( 0,-1, 0)), "3+ [-1-11]"),

    ((( 0, 1, 0),
      ( 0, 0,-1),
      (-1, 0, 0)), "3- [-1-11]"),

    (((-1, 0, 0),
      ( 0, 0, 1),
      ( 0, 1, 0)), "2 [011]"),

    (((-1, 0, 0),
      ( 0, 0,-1),
      ( 0,-1, 0)), "2 [01-1]"),

    ((( 1, 0, 0),
      ( 0, 0,-1),
      ( 0, 1, 0)), "4+ [100]"),

    ((( 1, 0, 0),
      ( 0, 0, 1),
      ( 0,-1, 0)), "4- [100]"),

    (((-1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "m [100]"),

    ((( 0, 0, 1),
      (-1, 0, 0),
      ( 0, 1, 0)), "-3+ [-1-11]"),

    ((( 0,-1, 0),
      ( 0, 0, 1),
      ( 1, 0, 0)), "-3- [-1-11]"),

    ((( 1, 0, 0),
      ( 0, 0,-1),
      ( 0,-1, 0)), "m [011]"),

    ((( 1, 0, 0),
      ( 0, 0, 1),
      ( 0,-1, 0)), "m [01-1]"),

    (((-1, 0, 0),
      ( 0, 0, 1),
      ( 0,-1, 0)), "-4+ [100]"),

    (((-1, 0, 0),
      ( 0, 0,-1),
      ( 0, 1, 0)), "-4- [100]"))

operations_hex = (
    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "1"),

    (((-1, 0, 0),
      ( 0,-1, 0),
      ( 0, 0, 1)), "2 [001]"),

    ((( 0, 1, 0),
      ( 1, 0, 0),
      ( 0, 0,-1)), "2 [110]"),

    ((( 0,-1, 0),
      (-1, 0, 0),
      ( 0, 0,-1)), "2 [1-10]"),

    (((-1, 0, 0),
      ( 0,-1, 0),
      ( 0, 0,-1)), "-1"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0,-1)), "m [001]"),

    ((( 0,-1, 0),
      (-1, 0, 0),
      ( 0, 0, 1)), "m [110]"),

    ((( 0, 1, 0),
      ( 1, 0, 0),
      ( 0, 0, 1)), "m [1-10]"),

    ((( 0,-1, 0),
      ( 1,-1, 0),
      ( 0, 0, 1)), "3+ [001]"),
    
    ((( 1,-1, 0),
      ( 1, 0, 0),
      ( 0, 0, 1)), "6+ [001]"),

    ((( 1,-1, 0),
      ( 0,-1, 0),
      ( 0, 0,-1)), "2 [100]"),

    (((-1, 1, 0),
      ( 0, 1, 0),
      ( 0, 0,-1)), "2 [120]"),

    ((( 0, 1, 0),
      (-1, 1, 0),
      ( 0, 0,-1)), "-3+ [001]"),

    (((-1, 1, 0),
      (-1, 0, 0),
      ( 0, 0,-1)), "-6+ [001]"),

    (((-1, 1, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "m [100]"),

    ((( 1,-1, 0),
      ( 0,-1, 0),
      ( 0, 0, 1)), "m [120]"),

    (((-1, 1, 0),
      (-1, 0, 0),
      ( 0, 0, 1)), "3- [001]"),

    ((( 0, 1, 0),
      (-1, 1, 0),
      ( 0, 0, 1)), "6- [001]"),

    (((-1, 0, 0),
      (-1, 1, 0),
      ( 0, 0,-1)), "2 [010]"),

    ((( 1, 0, 0),
      ( 1,-1, 0),
      ( 0, 0,-1)), "2 [210]"),

    ((( 1,-1, 0),
      ( 1, 0, 0),
      ( 0, 0,-1)), "-3- [001]"),

    ((( 0,-1, 0),
      ( 1,-1, 0),
      ( 0, 0,-1)), "-6- [001]"),

    ((( 1, 0, 0),
      ( 1,-1, 0),
      ( 0, 0, 1)), "m [010]"),

    (((-1, 0, 0),
      (-1, 1, 0),
      ( 0, 0, 1)), "m [210]"))

prim2conv = (
    ((( 1,-1, 1),
      ( 1, 1,-1),
      (-1, 1, 1)), "cF"),

    ((( 1,-1, 0),
      (-1, 0, 1),
      (-1,-1,-1)), "hR"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "cP"),
    
    ((( 1, 0, 1),
      ( 1, 1, 0),
      ( 0, 1, 1)), "cI"),

    ((( 1,-1, 0),
      (-1, 0, 1),
      (-1,-1,-1)), "hR"),
    
    ((( 0, 1, 1),
      ( 1, 0, 1),
      ( 1, 1, 0)), "tI"),

    ((( 1, 0, 1),
      ( 1, 1, 0),
      ( 0, 1, 1)), "tI"),

    (((-1,-1, 0),
      (-1, 0,-1),
      ( 0,-1,-1)), "oI"),

    ((( 1, 0, 0),
      (-1, 1, 0),
      (-1,-1, 3)), "hR"),

    ((( 1, 1, 0),
      ( 1,-1, 0),
      ( 0, 0,-1)), "mC"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "tP"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "hP"),

    ((( 1, 1, 0),
      (-1, 1, 0),
      ( 0, 0, 1)), "oC"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 1, 1, 2)), "tI"),

    (((-1,-1, 0),
      ( 1,-1, 0),
      ( 1, 1, 2)), "oF"),

    ((( 1, 1, 0),
      (-1, 1, 0),
      ( 0, 0, 1)), "mC"),

    ((( 1,-1, 0),
      ( 1, 1, 0),
      (-1, 0,-1)), "mC"),

    ((( 0,-1, 1),
      ( 1,-1,-1),
      ( 1, 0, 0)), "tI"),

    (((-1, 0, 0),
      ( 0,-1, 1),
      (-1, 1, 1)), "oI"),

    ((( 0, 1, 1),
      ( 0, 1,-1),
      (-1, 0, 0)), "mC"),

    ((( 0, 1, 0),
      ( 0, 0, 1),
      ( 1, 0, 0)), "tP"),

    ((( 0, 1, 0),
      ( 0, 0, 1),
      ( 1, 0, 0)), "hP"),

    ((( 0, 1, 1),
      ( 0,-1, 1),
      ( 1, 0, 0)), "oC"),

    ((( 1, 2, 1),
      ( 0,-1, 1),
      ( 1, 0, 0)), "hR"),

    ((( 0, 1, 1),
      ( 0,-1, 1),
      ( 1, 0, 0)), "mC"),

    ((( 1, 0, 0),
      (-1, 2, 0),
      (-1, 0, 2)), "oF"),

    (((-1, 2, 0),
      (-1, 0, 0),
      ( 0,-1, 1)), "mC"),

    (((-1, 0, 0),
      (-1, 0, 2),
      ( 0, 1, 0)), "mC"),
    
    ((( 1, 0, 0),
      ( 1,-2, 0),
      ( 0, 0,-1)), "mC"),

    ((( 0, 1, 0),
      ( 0, 1,-2),
      (-1, 0, 0)), "mC"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "aP"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "oP"),

    ((( 0,-1, 0),
      ( 0, 1, 2),
      (-1, 0, 0)), "oC"),

    ((( 0,-1, 0),
      (-1, 0, 0),
      ( 0, 0,-1)), "mP"),

    ((( 1, 0, 0),
      (-1, 0,-2),
      ( 0, 1, 0)), "oC"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "mP"),

    (((-1, 0, 0),
      ( 1, 2, 0),
      ( 0, 0,-1)), "oC"),

    (((-1, 0, 0),
      ( 0,-1, 0),
      ( 1, 1, 2)), "oI"),

    ((( 0,-1,-2),
      ( 0,-1, 0),
      (-1, 0, 0)), "mC"),

    ((( 1, 0, 2),
      ( 1, 0, 0),
      ( 0, 1, 0)), "mC"),

    (((-1,-2, 0),
      (-1, 0, 0),
      ( 0, 0,-1)), "mC"),

    (((-1, 0, 0),
      (-1,-1,-2),
      ( 0,-1, 0)), "mI"),

    ((( 1, 0, 0),
      ( 0, 1, 0),
      ( 0, 0, 1)), "aP"))
    

def print_matrix(m):
    for v in m:
        print "[%4.1f %4.1f %4.1f]" % tuple(v)

for (tmat, bravais) in prim2conv:
    if bravais[0] == "h":
        ops = operations_hex
    else:
        ops = operations
    for (op, symbol) in ops:
        op_prim = np.dot(np.dot(np.array(tmat).T, op), np.linalg.inv(np.array(tmat).T))
        print bravais, symbol,
        if (abs(op_prim) > 1.5).any():
            print "*"
        else:
            print
        print_matrix(op_prim)
        print
        
